<?php
    namespace Core\ORM;
    /**
     * Description of ORM
     *
     * @author mpetrini
     */
    abstract class ORMClasse implements InterfaceORM{
        /**
        * @var \Core\BDD $lien
        */
        public static $lien;
        /**
        * Instancie le lien vers la BDD
        * 
        * @return \Core\BDD
        */
        public static function initialisationLiaisonBDD() {
            self::$lien = new \Core\BDD();
        }
        
        /**
        * Récupère tout les types Primitifs gérés par cet ORM
        * 
        * @return array
        */
        private static function getTypesPrimitifs() {
            return array("int", "integer", "float", "double", "string", "text", "boolean");
        }
        
        /**
        * Récupère le nom de la table liée à la classe actuelle
        * 
        * @return string
        */
        public function getNomTable() {
            $classe = get_class($this);
            return $classe::getTable();
        }
        
        /**
        * Retourne un objet de type passé en paramètre
        *
        * @var string $nomClasse
        * @var array $tab 
        * @var string $antecedent (optional) (default='')
        * 
        * @return \Core\ORM\Modele
        */
        public static function creationObjet($nomClasse, $tab, $antecedent = '') {
            //On crée la Réflexion de la Classe
            $retourInstance = new \ReflectionClass($nomClasse);
            //Récupère tout les Attributs de la Classe
            $attributs = $nomClasse::getAttributs();
            //Tableau d'argument
            $tabArguments = array();
            //On va remplir le tableau des arguments
            foreach($attributs as $attribut) {
                //On ajoute l'ID
                if(empty($tabArguments)) {
                    $tabArguments[] = $tab[$antecedent.$nomClasse::getTable().'_id'];
                }
                
                if($attribut instanceof \Core\ORM\Attributs\Objet) {
                    $tabArguments[] = self::creationObjet($attribut->getNomClasse(), $tab, $antecedent.$nomClasse::getTable().'_');
                }
                else {
                    $tabArguments[] = $tab[$antecedent.$nomClasse::getTable().'_'.$attribut->getNom()];
                }
            }
            return $retourInstance->newInstanceArgs($tabArguments);
        }
    }
?>
